package com.yun.algorithmproblem.leetcode;

import java.util.Arrays;
import java.util.TreeSet;

/**
 * 1847. 最近的房间
 * <p>
 * 一个酒店里有 n 个房间，这些房间用二维整数数组 rooms 表示，其中 rooms[i] = [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一个房间号 roomIdi 保证是 独一无二 的。
 * <p>
 * 同时给你 k 个查询，用二维数组 queries 表示，其中 queries[j] = [preferredj, minSizej] 。第 j 个查询的答案是满足如下条件的房间 id ：
 * <p>
 * 房间的面积 至少 为 minSizej ，且
 * abs(id - preferredj) 的值 最小 ，其中 abs(x) 是 x 的绝对值。
 * 如果差的绝对值有 相等 的，选择 最小 的 id 。如果 没有满足条件的房间 ，答案为 -1 。
 * <p>
 * 请你返回长度为 k 的数组 answer ，其中 answer[j] 为第 j 个查询的结果。
 */
public class Leetcode1847 {

    public static void main(String[] args) {
        Leetcode1847 obj = new Leetcode1847();
        int[][] rooms = new int[][]{{1, 4}, {2, 3}, {3, 5}, {4, 1}, {5, 2}};
        int[][] queries = new int[][]{{2, 3}, {2, 4}, {2, 5}};
        int[] ans = obj.closestRoom(rooms, queries);
        System.out.println(Arrays.toString(ans));
    }

    public int[] closestRoom(int[][] rooms, int[][] queries) {
        Arrays.sort(rooms, (a, b) -> (b[1] - a[1]));
        Integer[] queriesIds = new Integer[queries.length];
        Arrays.setAll(queriesIds, i -> i);
        Arrays.sort(queriesIds, (i, j) -> queries[j][1] - queries[i][1]);
        int[] ans = new int[queries.length];
        Arrays.fill(ans, -1);
        TreeSet<Integer> roomIds = new TreeSet<>();
        int j = 0;
        for (Integer i : queriesIds) {
            int preferredId = queries[i][0];
            int minSize = queries[i][1];
            while (j < rooms.length && rooms[j][1] >= minSize) {
                roomIds.add(rooms[j][0]);
                j++;
            }
            int diff = Integer.MAX_VALUE;
            Integer floor = roomIds.floor(preferredId);
            if (floor != null) {
                diff = preferredId - floor;
                ans[i] = floor;
            }
            Integer ceiling = roomIds.ceiling(preferredId);
            if (ceiling != null && ceiling - preferredId < diff) {
                ans[i] = ceiling;
            }
        }
        return ans;
    }
}
